/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package poker;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import prop.Carta;
import prop.Configuracion;
import prop.DriverDomainRanking;
import prop.Jugador;

/**
 *
 * @author pol
 */
public class DriverDomainInterfaz implements Serializable {
    private Ventana vent;
    private Partida part;
    private MesaPoker mesa;
    private JugadorPoker jug;
    private DriverDomainRanking ddr;
    private Sistema sist;
    private enum TipoEspera{DESCARTE, APUESTA};
    private TipoEspera tipoesp;
    private int humanos;

    public DriverDomainInterfaz(Sistema sistema, DriverDomainRanking ddr) {
        sist = sistema;
        this.ddr = ddr;
        vent = new Ventana(this, this.ddr, sist.conf);
    }

    public void setJugando(boolean t) {
        vent.setJugando(t);
    }

    public Sistema getSistema() {
        return sist;
    }
    
    public void setPartida(Partida partida) {
        part = partida;
    }

    public void setHumanos(int h) {
        humanos = h;
    }

    public void setMesa(MesaPoker mesa) {
        this.mesa = mesa;
    }

    public void anadirLog(String s) {
        vent.anadirLog(s);
    }

    public void setLog(String s) {
        vent.setLog(s);
    }
    
    public void iniciarDescarte(JugadorPoker jug) {
        this.jug = jug;
        tipoesp = TipoEspera.DESCARTE;
        if(humanos > 1) iniciarEspera(jug);
        else finalizarEspera();
    }

    public void finalizarDescarte(Vector vect) {
        int n = vect.size();
        for (int i = 0; i < n; ++i) {
            mesa.getBaraja().anadirCarta(jug.descartar((Carta) vect.get(i)));
            jug.getMano().anadirCarta(mesa.sacarCarta());
        }
        part.seguir();
    }

    public void iniciarGanaPartida(JugadorPoker jug, int bote) {
        vent.iniciarGanaPartida(jug.getNombre(), Integer.toString(bote));
    }

    public void iniciarGanaPartida(Vector<JugadorPoker> v, int bote) {
        Vector<String> u = new Vector<String>();
        for (int i = 0; i < v.size(); ++i) {
            u.add(v.get(i).getNombre());
        }
        vent.iniciarGanaPartida(u, Integer.toString(bote));
    }

    public void finalizarGanaPartida() {
        part.seguir();
    }

    public void iniciarGanaSesion(Vector<Jugador> v) {
        int n = v.size();
        for (int i = 0; i < n; ++i) {
            int p = i;
            for (int j = i + 1; j < n; ++j)
                if (v.get(j).getDinero() > v.get(p).getDinero()) p = j;
            JugadorPoker aux = (JugadorPoker)v.get(i);
            v.set(i, v.get(p));
            v.set(p, aux);
        }
        Vector<String> u = new Vector<String>();
        int i = 0;
        while (i < n && v.get(i).getDinero() == v.get(0).getDinero()) u.add(v.get(i++).getNombre());
        vent.iniciarGanaSesion(u, String.valueOf(v.get(0).getDinero()));
    }

    public void finalizarGanaSesion() {
        sist.getSesion().finSesion();
    }

    public void iniciarApuesta(JugadorPoker jug) {
        this.jug = jug;
        tipoesp = TipoEspera.APUESTA;
        if(humanos > 1) iniciarEspera(jug);
        else finalizarEspera();
    }

    public void finalizarApuesta(int apuestaFinal) {
        if (apuestaFinal < mesa.getApuesta()) jug.setEstado(ManoPoker.Estado.RETIRADO);
        else if (apuestaFinal >= mesa.getApuesta()) {
            mesa.setApuesta(apuestaFinal);
            jug.setApuesta(apuestaFinal);
        }
        part.seguir();
    }

    public void iniciarEspera(JugadorPoker j) {
        vent.iniciarEspera(j.getNombre());
    }

    public void finalizarEspera() {
        if (tipoesp == TipoEspera.DESCARTE)
            vent.iniciarDescarte(jug.getMano().getVector(), jug.getNombre());
        else if (tipoesp == TipoEspera.APUESTA)
            vent.iniciarApuesta(jug.getNombre(), jug.getDinero(), mesa.getApuesta(), jug.getMano().getVector());
    }

    public void mostrarMensaje(String mensaje) {
        JOptionPane.showMessageDialog(vent, mensaje);
    }

    public void iniciarSesion(Vector<JugadorPoker> v, int comodines, int partidas, String nom) {
        sist.nuevaSesion(v, comodines, partidas, nom);
    }

    public String pedirString(String mensaje) {
        return JOptionPane.showInputDialog(vent, mensaje);
    }

    public void guardarConf(String f, Configuracion c) {
        f = Main.rutaProg + f;
        try {
            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(f));
            o.writeObject(c);
            o.close();
        } catch (IOException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void cargarSesion(String f) {
        f = Main.rutaProg + f;
        Configuracion c = null;
        ObjectInputStream o = null;
        try {
            o = new ObjectInputStream(new FileInputStream(f));
            sist.sesion = (SesionPoker) o.readObject();
            o.close();
        } catch (FileNotFoundException ex) {
            JOptionPane.showMessageDialog(vent, "No existe ninguna sesion con este nombre");
            return;
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        sist.sesion.setDDI(this);
        sist.sesion.restaura();
    }

    public void guardarSesion(String f, SesionPoker s) {
        sist.sesion.unsetDDI();
        f = Main.rutaProg + f;
        try {
            ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(f));
            o.writeObject(s);
            o.close();
        } catch (IOException ex) {
            Logger.getLogger(Sistema.class.getName()).log(Level.SEVERE, null, ex);
        }
        sist.sesion.setDDI(this);
    }

    public DriverDomainRanking getDDR() {
        return ddr;
    }
}
